// 封装 axios
import axios from 'axios';

// import { message } from 'antd';
import { Toast } from 'antd-mobile';
import { store } from '@/store/store';
import { logout } from '@/store/actions/login';
import { customHistory } from './history';
import { clearToken, setToken } from './token';

const http = axios.create({
  baseURL: 'http://toutiao.itheima.net/v1_0',
  // baseURL: 'http://geek.itheima.net/v1_0',
  timeout: 5000,
});

// 将来可以继续进行 拦截器 的处理

// 请求拦截器
http.interceptors.request.use((config) => {
  // 获取token
  const token = store.getState().login.token;

  // 除了登录请求外，其他请求统一添加 token
  if (!config.url?.startsWith('/authorizations')) {
    config.headers!.Authorization = `Bearer ${token}`;
  }

  return config;
});

// 响应拦截器
http.interceptors.response.use(undefined, async (error) => {
  // 响应失败时，会执行此处的回调函数
  if (!error.response) {
    // 网路超时
    Toast.show('网络超时，请稍后再试');
    return Promise.reject(error);
  }

  if (error.response.status === 401) {
    try {
      // 1 重新获取token
      // 判断 refresh_token是否存在
      const refresh_token = store.getState().login.refresh_token;
      // 重新获取token失败
      if (!refresh_token) throw new Error('refresh_token 不存在');

      console.log('准备换取新的token');
      // 如果换的过程中也会有问题，有问题，直接就到catch
      const res = await axios.put(
        'http://toutiao.itheima.net/v1_0/authorizations',
        null,
        {
          headers: { Authorization: `Bearer ${refresh_token}` },
        }
      );
      console.log('换取token res', res);
      // 更新本地token和redux中token
      const newToken = {
        token: res.data.data.token,
        refresh_token: refresh_token,
      };
      console.log('newToken==>', newToken);
      // 3 将获取到的token保存到本地和redux中
      // 保存到本地
      setToken(newToken);
      // 保存到redux
      store.dispatch({
        type: 'login/token',
        payload: newToken,
      });
      // 2 重新发送之前的请求
      console.dir(error);
      return http(error.config);
    } catch (error) {
      // 换取失败
      // 删除本地toekn
      clearToken();
      // 删除redux中的token
      store.dispatch({
        type: 'login/token', // 复用 login/token 目的都是给token赋值，只不过这里赋的是空值
        payload: { token: '', refresh_token: '' },
      });
      // 提示用户
      Toast.show({
        content: '登录超时，请重新登录!!!!',
        duration: 1000,
        afterClose: () => {
          customHistory.push('/login', {
            from: customHistory.location.pathname,
          });
          // 触发退出 action，将 token 等清除
          // store.dispatch(logout());
        },
      });
      return Promise.reject(error);
    }
  }
});

export { http };
